package com.cskaoyan.javase.oop1._13block._1building._4usecase;

/**
 * 根据构造代码块的特点，分析一下它的实际使用场景。
 * 构造代码块最大的特点就是其中的代码，最终会加入类的所有构造器中
 * 所以依据这一点：
 * 我们可以"提取公因式"一样的，把所有构造器都需要执行的代码，放入构造代码块中。
 *
 * 其次，构造代码块毕竟是给成员变量赋值用的，所以：
 * 如果需要很复杂的代码完成成员变量的赋值（如果只是给一个值，用显式赋值和构造器足矣）
 * 比如需要一个算法，需要一定计算等等。在这些场景下，使用构造代码块赋值也是一个不错的选择。
 *
 *
 * @since 15:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new Student();
        }
        for (int i = 0; i < 3; i++) {
            new Student("张三");
        }
        for (int i = 0; i < 2; i++) {
            new Student("李四", 18);
        }
        System.out.println(Student.count);
    }
}

class Student {
    String name;
    int age;
    double salary;

    static int count = 0;

    {
        /*
            new一次对象,构造代码块必然执行一次,不管使用什么构造器
            所以把count++放在这里,可以简化代码
          */
        count++;
    }

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 需求: 要求计算外部new创建对象的次数
}